/**
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Prepare mandatory params for ecma.call1thisdyn, ecma.call2thisdyn, ecma.call3thisdyn
// regs set as follow
// %rax - insn_ptr, %rbx - frame.vregs, %r12 - method, %r15 - acc, %r13, %r14 - temp
    // ABI arg reg 0 (rdi) <- ark::Method*
    movq %r12, %rdi

    // Reserve stack args
    leal (, %rsi, 8), %r8d
    subq %r8, %rsp
    andq $-16, %rsp

    // ABI arg stack <- functional object
    movzbl (%rax), %r13d
    movq (%rbx, %r13, FRAME_VREGISTER_SIZE), %r14
    movq %r14, (0 * FRAME_VREGISTER_SIZE)(%rsp)

    // ABI arg stack <- new.target
    movq $TAGGED_VALUE_UNDEFINED, (1 * FRAME_VREGISTER_SIZE)(%rsp)

    // ABI arg stack <- resolved this
    movzbl 1(%rax), %r13d
    movq (%rbx, %r13, FRAME_VREGISTER_SIZE), %r14
    movq %r14, (2 * FRAME_VREGISTER_SIZE)(%rsp)
